package org.shop.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import org.shop.dao.UserInfoDao;
import org.shop.entity.UserInfo;
import org.shop.util.DBUtil;
import org.shop.util.PagerUtil;

/**
 * UserInfoDao接口的实现类 - 接口的其中的一种实现（方案）
 * 
 * @author Administrator
 *
 */
public class UserInfoDaoImpl implements UserInfoDao {

	@Override
	public int insertUser(UserInfo user) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int deleteUser(int id) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int updateUser(UserInfo user) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public List<UserInfo> selectAllUser() {
		List<UserInfo> list = new ArrayList<>();

		// 第一：定义操作数据库的SQL语句
		String sql = "select * from userinfo";

		// 第二：获取连接对象 - 导包：ctrl + shift + o
		Connection conn = DBUtil.getConnection();

		// 第三：获取语句对象
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		try {
			pstmt = conn.prepareStatement(sql);

			// 第四：填充SQL语句

			// 第五：执行SQL语句（更新操作、查询操作）
			rst = pstmt.executeQuery();

			// 第六：处理执行结果
			while (rst.next()) {
				// 1.获取当前行中，各字段的数据 - 结果集对象.getXxx(下标)
				int id = rst.getInt(1);
				String username = rst.getString(2);
				// String password = rst.getString(3);
				String name = rst.getString(4);
				String image = rst.getString(5);
				String sex = rst.getString(6);
				String phone = rst.getString(7);
				String address = rst.getString(8);
				String zipCode = rst.getString(9);
				String email = rst.getString(10);
				Timestamp regTime = rst.getTimestamp(11);

				// 2.创建实体对象
				UserInfo user = new UserInfo();

				// 3.初始化对象 - 把以上读取的各列数据，封装到实体对象中
				user.setId(id);
				user.setUsername(username);
				// user.setPassword(password);
				user.setName(name);
				user.setImage(image);
				user.setSex(sex);
				user.setPhone(phone);
				user.setAddress(address);
				user.setZipCode(zipCode);
				user.setEmail(email);
				user.setRegTime(regTime);

				// 4.把当前行的数据（uer）添加到集合中
				list.add(user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 第七：关闭对象
			DBUtil.close(rst, pstmt, conn);
		}

		return list;
	}

	@Override
	public UserInfo selectUserById(int id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public UserInfo selectUser(String username) {
		UserInfo user = null;

		// 第一：定义操作数据库的SQL语句
		String sql = "select * from userinfo where username=?";

		// 第二：获取连接对象 - 导包：ctrl + shift + o
		Connection conn = DBUtil.getConnection();

		// 第三：获取语句对象
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		try {
			pstmt = conn.prepareStatement(sql);

			// 第四：填充SQL语句
			pstmt.setString(1, username);

			// 第五：执行SQL语句（更新操作、查询操作）
			rst = pstmt.executeQuery();

			// 第六：处理执行结果
			if (rst.next()) {
				// 1.获取当前行中，各字段的数据 - 结果集对象.getXxx(下标)
				int id = rst.getInt(1);
				// String username = rst.getString(2) ;
				String password = rst.getString(3);
				String name = rst.getString(4);
				String image = rst.getString(5);
				String sex = rst.getString(6);
				String phone = rst.getString(7);
				String address = rst.getString(8);
				String zipCode = rst.getString(9);
				String email = rst.getString(10);
				Timestamp regTime = rst.getTimestamp(11);

				// 2.创建实体对象
				user = new UserInfo();

				// 3.初始化对象 - 把以上读取的各列数据，封装到实体对象中
				user.setId(id);
				user.setUsername(username);
				user.setPassword(password);
				user.setName(name);
				user.setImage(image);
				user.setSex(sex);
				user.setPhone(phone);
				user.setAddress(address);
				user.setZipCode(zipCode);
				user.setEmail(email);
				user.setRegTime(regTime);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 第七：关闭对象
			DBUtil.close(rst, pstmt, conn);
		}
		return user;
	}

	@Override
	public PagerUtil<UserInfo> selectAllUserByPager(int currentPage, int pageCount) {

		// 创建List集合，用于存储各行数据
		List<UserInfo> list = new ArrayList<>();

		// 创建PagerUtil对象，用于封装存储分页信息
		PagerUtil<UserInfo> pagerUtil = new PagerUtil<UserInfo>();

		// 总记录数
		pagerUtil.setTotalRecordCount(selectAllUserCount());

		// 每页显示记录数
		pagerUtil.setPageCount(pageCount);

		// 当前页 - 注意：必须后于 总记录数和每页显示记录数 初始化
		pagerUtil.setCurrentPage(currentPage);

		// 总页数 -- 总页数的计算交给PagerUtil工具类内部完成

		// 第一：定义操作数据库的SQL语句
		StringBuilder sb = new StringBuilder();

		sb.append("select * from ( ");
		sb.append("select *, row_number() over(order by a.id asc) as rownumber ");
		sb.append("from userinfo as a ");
		sb.append(") as b ");
		sb.append("where rownumber between  ? and ?");

		String sql = sb.toString();

		// 第二：获取连接对象 - 导包：ctrl + shift + o
		Connection conn = DBUtil.getConnection();

		// 第三：获取语句对象
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		try {
			pstmt = conn.prepareStatement(sql);

			// 第四：填充SQL语句
			pstmt.setInt(1, (pagerUtil.getCurrentPage() - 1) * pageCount + 1);
			pstmt.setInt(2, pagerUtil.getCurrentPage() * pageCount);

			// 第五：执行SQL语句（更新操作、查询操作）
			rst = pstmt.executeQuery();

			// 第六：处理执行结果
			while (rst.next()) {
				// 1.获取当前行中，各字段的数据 - 结果集对象.getXxx(下标)
				int id = rst.getInt(1);
				String username = rst.getString(2);
				// String password = rst.getString(3);
				String name = rst.getString(4);
				String image = rst.getString(5);
				String sex = rst.getString(6);
				String phone = rst.getString(7);
				String address = rst.getString(8);
				String zipCode = rst.getString(9);
				String email = rst.getString(10);
				Timestamp regTime = rst.getTimestamp(11);

				// 2.创建实体对象
				UserInfo user = new UserInfo();

				// 3.初始化对象 - 把以上读取的各列数据，封装到实体对象中
				user.setId(id);
				user.setUsername(username);
				// user.setPassword(password);
				user.setName(name);
				user.setImage(image);
				user.setSex(sex);
				user.setPhone(phone);
				user.setAddress(address);
				user.setZipCode(zipCode);
				user.setEmail(email);
				user.setRegTime(regTime);

				// 4.把当前行的数据（uer）添加到集合中
				list.add(user);
			}

			// 5.把list集合添加到PagerUtil工具中（注意：必须在循环外面）
			pagerUtil.setData(list);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 第七：关闭对象
			DBUtil.close(rst, pstmt, conn);
		}

		return pagerUtil;
	}

	@Override
	public int selectAllUserCount() {
		int count = 0;

		// 第一：定义操作数据库的SQL语句
		String sql = "select count(id) from userinfo";

		// 第二：获取连接对象 - 导包：ctrl + shift + o
		Connection conn = DBUtil.getConnection();

		// 第三：获取语句对象
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		try {
			pstmt = conn.prepareStatement(sql);

			// 第四：填充SQL语句

			// 第五：执行SQL语句（更新操作、查询操作）
			rst = pstmt.executeQuery();

			// 第六：处理执行结果
			if (rst.next()) {
				count = rst.getInt(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 第七：关闭对象
			DBUtil.close(rst, pstmt, conn);
		}
		return count;
	}

	@Override
	public PagerUtil<UserInfo> selectAllUserByPagerAndCond(int currentPage, int pageCount, String cond) {
		// 创建List集合，用于存储各行数据
		List<UserInfo> list = new ArrayList<>();

		// 创建PagerUtil对象，用于封装存储分页信息
		PagerUtil<UserInfo> pagerUtil = new PagerUtil<UserInfo>();

		// 总记录数
		pagerUtil.setTotalRecordCount(selectAllUserCount(cond));

		// 每页显示记录数
		pagerUtil.setPageCount(pageCount);

		// 当前页 - 注意：必须后于 总记录数和每页显示记录数 初始化
		pagerUtil.setCurrentPage(currentPage);

		// 总页数 -- 总页数的计算交给PagerUtil工具类内部完成

		// 第一：定义操作数据库的SQL语句
		StringBuilder sb = new StringBuilder();

		sb.append("select * from ( ");
		sb.append("select *, row_number() over(order by a.id asc) as rownumber ");
		sb.append("from userinfo as a ");
		sb.append("where username like ?");
		sb.append(") as b ");
		sb.append("where rownumber between  ? and ?");

		String sql = sb.toString();

		// 第二：获取连接对象 - 导包：ctrl + shift + o
		Connection conn = DBUtil.getConnection();

		// 第三：获取语句对象
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		try {
			pstmt = conn.prepareStatement(sql);

			// 第四：填充SQL语句
			pstmt.setString(1, "%" + cond + "%");
			pstmt.setInt(2, (pagerUtil.getCurrentPage() - 1) * pageCount + 1);
			pstmt.setInt(3, pagerUtil.getCurrentPage() * pageCount);

			// 第五：执行SQL语句（更新操作、查询操作）
			rst = pstmt.executeQuery();

			// 第六：处理执行结果
			while (rst.next()) {
				// 1.获取当前行中，各字段的数据 - 结果集对象.getXxx(下标)
				int id = rst.getInt(1);
				String username = rst.getString(2);
				// String password = rst.getString(3);
				String name = rst.getString(4);
				String image = rst.getString(5);
				String sex = rst.getString(6);
				String phone = rst.getString(7);
				String address = rst.getString(8);
				String zipCode = rst.getString(9);
				String email = rst.getString(10);
				Timestamp regTime = rst.getTimestamp(11);

				// 2.创建实体对象
				UserInfo user = new UserInfo();

				// 3.初始化对象 - 把以上读取的各列数据，封装到实体对象中
				user.setId(id);
				user.setUsername(username);
				// user.setPassword(password);
				user.setName(name);
				user.setImage(image);
				user.setSex(sex);
				user.setPhone(phone);
				user.setAddress(address);
				user.setZipCode(zipCode);
				user.setEmail(email);
				user.setRegTime(regTime);

				// 4.把当前行的数据（uer）添加到集合中
				list.add(user);
			}

			// 5.把list集合添加到PagerUtil工具中（注意：必须在循环外面）
			pagerUtil.setData(list);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 第七：关闭对象
			DBUtil.close(rst, pstmt, conn);
		}

		return pagerUtil;
	}

	@Override
	public int selectAllUserCount(String cond) {
		int count = 0;

		// 第一：定义操作数据库的SQL语句
		String sql = "select count(id) from userinfo where username like ?";

		// 第二：获取连接对象 - 导包：ctrl + shift + o
		Connection conn = DBUtil.getConnection();

		// 第三：获取语句对象
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		try {
			pstmt = conn.prepareStatement(sql);

			// 第四：填充SQL语句
			pstmt.setString(1, "%" + cond + "%");

			// 第五：执行SQL语句（更新操作、查询操作）
			rst = pstmt.executeQuery();

			// 第六：处理执行结果
			if (rst.next()) {
				count = rst.getInt(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 第七：关闭对象
			DBUtil.close(rst, pstmt, conn);
		}
		return count;
	}

}
